// let arr = ["hello", "world"]

// let iter = arr[Symbol.iterator]() //拿到迭代器·1
// let iter1 = arr[Symbol.iterator]()
// console.log(iter);
//   // console.log(iter.next());
//   // console.log(iter.next());
//   // console.log(iter1.next());

// // console.log(iter.next());
// // console.log(iter.next());
// // console.log(iter1.next());
// // console.log(iter1.next());
// console.log(iter.next());
// arr.splice(1, 0, "cuifan")
// console.log(iter.next());
// console.log(iter.next());
// console.log(iter.next());
// 实现一个原生的迭代器‘
// class Foo {
//   [Symbol.iterator]() {
//     return {
//       next() {
//         return {
//           value: 'cuifan',
//           done: false
//         }
//       }
//     }
//   }
// }

// let foo = new Foo()
// let iter = foo[Symbol.iterator]()
// console.log(iter.next());

// 实现一个计数迭代器
// class Counter {
//   // 可以迭代limit次
//   constructor(limit) {
//     this.limit = limit,
//       this.count = 0
//   }
//   next() {
//     if (this.count < this.limit) {
//       return {
//         done: false,
//         value: this.count++
//       }
//     } else {
//       return {
//         done: true,
//         value: undefined
//       }
//     }
//   }

//   [Symbol.iterator]() {
//     return this
//   }
// }

// let counter = new Counter(4)
// for (let i of counter) {
//   console.log(i);
// }

class Counter {
  constructor(limit) {
    this.limit = limit
  }

  [Symbol.iterator]() {
    let count = 0
    let self = this
    return {
      next() {
        if (count < self.limit) {
          return {
            done: false,
            value: count++
          }
        } else {
          return {
            done: true,
            value: undefined
          }
        }
      },
      return () {
        // 如果在内置语言结构中使用break,continue,return,throw等或者结构操作并没有消费全部的值
        console.log('Exiting early');
        return {
          done: true
        }
      }
    }
  }
}

// let counter = new Counter(5)[Symbol.iterator]()

// for (let i of counter) {
//   if (i > 2) break
//   console.log(i);
// }

// for (let i of counter) {
//   console.log(i);
// }
// let counter = new Counter(4)

// // for (let i of counter) {
// //   console.log(i);
// // }

// let iter1 = counter[Symbol.iterator]()
// let iter2 = counter[Symbol.iterator]()
// console.log(iter1 === iter2);

// let arr = [1, 2, 3, 4]
// let iter1 = arr[Symbol.iterator]()
// let iter2 = iter1[Symbol.iterator]()
//   // console.log(iter1 == iter2);
// console.log(iter1.next());
// console.log(iter2.next());


let arr = [1, 2, 3, 4]
let iter = arr[Symbol.iterator]()

iter.return = function() {
  console.log('return');
  return {
    done: true
  }
}
for (let i of iter) {
  if (i > 2) break
  console.log(i);
}

for (let i of iter) {
  console.log(i);
}